#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
用户认证模块
"""

import hashlib
import os
from functools import wraps
from flask import session, redirect, url_for


class AuthManager:
    def __init__(self):
        """初始化认证管理器"""
        # 默认用户（实际应用中应该从数据库获取）
        self.users = {
            'admin': self._hash_password('admin123')
        }
    
    def _hash_password(self, password):
        """
        对密码进行哈希处理
        
        Args:
            password (str): 原始密码
            
        Returns:
            str: 哈希后的密码
        """
        # 使用SHA256进行哈希处理（实际应用中建议使用更安全的算法如bcrypt）
        return hashlib.sha256(password.encode('utf-8')).hexdigest()
    
    def verify_user(self, username, password):
        """
        验证用户凭据
        
        Args:
            username (str): 用户名
            password (str): 密码
            
        Returns:
            bool: 验证是否成功
        """
        if username in self.users:
            hashed_password = self.users[username]
            return hashed_password == self._hash_password(password)
        return False
    
    def add_user(self, username, password):
        """
        添加新用户
        
        Args:
            username (str): 用户名
            password (str): 密码
        """
        self.users[username] = self._hash_password(password)
    
    def remove_user(self, username):
        """
        删除用户
        
        Args:
            username (str): 用户名
        """
        if username in self.users:
            del self.users[username]
    
    def change_password(self, username, current_password, new_password):
        """
        修改用户密码
        
        Args:
            username (str): 用户名
            current_password (str): 当前密码
            new_password (str): 新密码
            
        Returns:
            bool: 修改是否成功
        """
        # 首先验证当前密码是否正确
        if not self.verify_user(username, current_password):
            return False
        
        # 更新密码
        self.users[username] = self._hash_password(new_password)
        return True


# 创建全局认证管理器实例
auth_manager = AuthManager()


def login_required(f):
    """
    登录验证装饰器
    
    Args:
        f (function): 被装饰的函数
        
    Returns:
        function: 装饰后的函数
    """
    @wraps(f)
    def decorated_function(*args, **kwargs):
        # 检查用户是否已登录
        if 'username' not in session:
            return redirect(url_for('login'))
        return f(*args, **kwargs)
    return decorated_function